import axios from 'axios'

// 2. 导入进度条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

import { ElMessage } from 'element-plus'
import { useRouter } from 'vue-router'

import { useUserStore } from '@/stores'
let userStore = useUserStore()
let router = useRouter()

// 3. 关闭小圆圈
NProgress.configure({
  showSpinner: false
})

let request = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_URL
})

// 添加请求拦截器
request.interceptors.request.use(
  function (config) {
    // 开启进度条
    NProgress.start()
    // 如果token不存在就使用refresh_token发请求
    if (userStore.tokenObj && userStore.tokenObj.token) {
      let token = userStore.tokenObj.token
      config.headers['Authorization'] = token
    }
    return config
  },
  function (error) {
    // 请求错误
    // 基本用不着
    return Promise.reject(error)
  }
)

// 添加响应拦截器
request.interceptors.response.use(
  async function (response) {
    NProgress.done()
    // 业务报错
    if (response.data.code === 20090) {
      // token 过期(访问了需要token，但是却没有携带token的接口)
      // 检查有没有refresh_token
      if (userStore.tokenObj && userStore.tokenObj.refresh_token) {
        // 删除旧token
        let copyRefresh = userStore.tokenObj.refresh_token
        userStore.setToken({ refresh_token: copyRefresh })
        // 调用接口进行刷新
        let res = await request({
          url: '/login/refresh',
          method: 'get',
          headers: {
            Authorization: `${copyRefresh}` // 重新发送请求，使用 refresh_token
          }
        })
        // 头条的写法是响应拦截器自己拦截了错误请求，但是这里不行，这里要判断
        if (res.code === 20041) {
          // token 刷新成功，重新发起被搁置的请求
          // token刷新成功，得到两个token进行存储
          await userStore.setToken({ ...res.data })
          response.config.headers.Authorization = '' // 清空原来的url的请求头
          request(response.config) // 重新发送
          // 如果有可供返回的页面就要进行返回
          return
        } else {
          // reftrsh_token失效
          userStore.setToken(null)
          ElMessage.error('refresh_token 超时，请重新登录')
          router.push('/login')
          return
        }
      } else {
        // refresh_token 在本地存储中不存在，退出刷新操作
        userStore.setToken(null)
        ElMessage.error('refresh_token不存在，无感刷新失败，请重新登录')
        router.push('/login')
        return
      }
    }
    return response.data
  },
  async (error) => {
    // 由于所有的响应都是2开头，所以如果能进入到此，那必定是网络错误,或者是 401
    if (error.response) {
      return Promise.reject(error)
    } else {
      return ElMessage.error('网络错误')
    }
  }
)

export default request
